// 基于 axios 封装的请求模块
import axios from 'axios'
import router from '@/router'
import { Notify } from 'vant'
import { getToken, removeToken, setToken } from './token'
import { refreshTokenAPI } from '@/api'

// 新建一个新的axios实例
const request = axios.create({
  baseURL: 'https://toutiao.itheima.net', // 基地址
  timeout: 20000 // 20秒超时时间
})

// 1.请求拦截器
request.interceptors.request.use(config => {
  // token不为空并且未已经携带了Authorization则加Authorization
  if (getToken()?.length > 0 && config.headers.Authorization === undefined) {
    config.headers.Authorization = 'Bearer ' + getToken()
  }
  return config
}, error => Promise.reject(error))

// 2.响应拦截器
request.interceptors.response.use(response => {
  return response
}, async error => {
  if (error.response.status === 401) {
    removeToken()
    // Notify({ type: 'warning', message: '身份已过期,请重新登录' })
    // 1.有感知，直接返回登录页
    // router.replace('/login')

    // 2.无感知，直接刷新token
    const { data: res } = await refreshTokenAPI()
    // 得到了新的token,更新token
    setToken(res.data.token)
    // 更新新的请求头里面的token
    error.config.headers.Authorization = 'Bearer ' + res.data.token
    // 再发一次失败请求 error.config就是上一次配置对象
    return axios(error.config)
  } else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations' && error.config.method === 'put') {
    // refresh_token也过期,必须重新登录
    Notify({ type: 'warning', message: '身份已过期,请重新登录' })
    sessionStorage.clear()
    router.replace(`/login?path=${router.currentRoute.fullPath}`)
  }
  return Promise.reject(error)
})

// 导出自定义函数, 参数对象解构赋值
export default ({ url, method = 'GET', params, data, headers }) => {
  return request({
    url: url,
    method: method,
    params: params,
    data: data,
    headers: headers
  })
}
